对于Variant类型最基本的查询是，咨询动态值的类型是否是特定的类型T，并在其类型已知时访问动态值。下面定义的is()成员函数，可以确定Variant当前是否存储T类型的值:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{variant/variantis.hpp}
\begin{lstlisting}[style=styleCXX]
template<typename... Types>
template<typename T>
bool Variant<Types...>::is() const
{
	return this->getDiscriminator() ==
	VariantChoice<T, Types...>::Discriminator;
}
\end{lstlisting}

给定变量v, v.is<int>()将确定v的动态值是否为int类型。检查很简单，将变量存储中的discriminator与对应VariantChoice基类的Discriminator值进行比较。

若正在寻找的类型(T)在列表中没有找到，VariantChoice基类将无法进行实例化，因为FindIndexOfT将不包含值成员，从而导致is<T>()中的(故意的)编译失败。这可以防止用户在请求不可能存储在变体中的类型时，报错进行提示。

get()成员函数提取对存储值的引用。必须提供要提取的类型(例如，v.get<int>())，并且只有当变量的动态值确实为该类型时才有效:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{variant/variantget.hpp}
\begin{lstlisting}[style=styleCXX]
#include <exception>

class EmptyVariant : public std::exception {
};

template<typename... Types>
template<typename T>
T& Variant<Types...>::get() & {
	if (empty()) {
		throw EmptyVariant();
	}

	assert(is<T>());
	return *this->template getBufferAs<T>();
}
\end{lstlisting}

当Variant不存储值(标识值是0)时，get()会抛出EmptyVariant异常。由于异常，discriminator可以是0，在第26.4.3节中描述。从错误类型的Variant获取值的尝试，会通过断言进行检查。













































